// 变量：保存已采集的真实地址（绝对路径）
const collectedImages = new Set()
let scan_status = false

/* 监听 background 的指令 */
chrome.runtime.onMessage.addListener((msg) => {
    if (msg.type === 'SET_SCAN') {
        scan_status = msg.enabled
        if (scan_status) {
            // 立即采集一次
            collectImage()
        }
    }
})

// 方法函数：收集当前页面所有真实图片地址
function collectImage() {
    if (!scan_status) {
        return
    }
    document.querySelectorAll('*:not(html):not(body):not(head):not(meta):not(script):not(iframe):not(style):not(link)')
        .forEach(el => {
            let url = pickImageSrc(el)
            if (url && url !== '') {
                collectedImages.add(new URL(url, location.href).href)
                const count = collectedImages.size
                chrome.runtime.sendMessage({cmd: 'setBadge', text: count.toString()})
            }
        })
}

// 方法函数：提取单个元素的真实图片地址
function pickImageSrc(el) {
    if (el.tagName === 'IMG') {
        // img 标签
        const raw = el.dataset.src || el.dataset.original || el.src
        return raw ? raw.trim() : null
    } else {
        // 非 img 标签，获取背景图片
        const bg = getComputedStyle(el).backgroundImage
        const m = bg.match(/url\(["']?([^"')]+)["']?\)/)
        return m ? m[1] : null
    }
}

// 运行启动
(() => {
    // 不需要立即采集。页面加载完成后，会更新设置右键菜单，那个时候再根据状态判断是否采集
    // collectImage()

    // 持续监听新增节点
    let timer
    const observer = new MutationObserver(() => {
        clearTimeout(timer)
        // 1s 内多次变动只执行一次
        timer = setTimeout(collectImage, 1000)
    })
    observer.observe(document.body, {childList: true, subtree: true})
    // 页面卸载时清空
    window.addEventListener('beforeunload', () => collectedImages.clear())

    // 对外开放
    window.getCollectedImages = () => [...collectedImages]
})()
